Lesson 6

v1.1, 2020.4 edit by David Yi

本次内容要点

  • 随机数
  • 思考:猜数游戏等

随机数

随机数这一概念在不同领域有着不同的含义,在密码学、通信领域有着非常重要的用途。

Python 的随机数模块是 random,random 模块主要有以下函数,结合例子来看看。

  • random.choice() 从序列中获取一个随机元素
  • random.sample() 创建指定范围内指定个数的随机数
  • random.random() 用于生成一个0到1的随机浮点数
  • random.uniform() 用于生成一个指定范围内的随机浮点数
  • random.randint() 生成一个指定范围内的整数
  • random.shuffle() 将一个列表中的元素打乱
  • random.sample() 从指定序列中随机获取指定长度的片断

In [2]:
import random

# random.choice(sequence)。参数sequence表示一个有序类型。
# random.choice 从序列中获取一个随机元素。

print(random.choice(range(1,100)))

# 从一个列表中产生随机元素
list1 = ['a', 'b', 'c']
print(random.choice(list1))


42
b

In [2]:
# random.sample()

# 创建指定范围内指定个数的整数随机数
print(random.sample(range(1,100), 10))

print(random.sample(range(1,10), 5))

# 如果要产生的随机数数量大于范围边界,会怎么样?
# print(random.sample(range(1,10), 15))


[68, 73, 84, 54, 28, 94, 93, 71, 86, 16]
[3, 5, 9, 7, 1]

In [3]:
# random.randint(a, b),用于生成一个指定范围内的整数。
# 其中参数a是下限,参数b是上限,生成的随机数n: a <= n <= b
print(random.randint(1,100))

# random.randrange([start], stop[, step]),
# 从指定范围内,按指定基数递增的集合中 获取一个随机数。
print(random.randrange(1,10))

# 可以多运行几次,看看结果总是哪几个数字
print(random.randrange(1,10,3))


27
4
1

In [3]:
# random.random()用于生成一个0到1的随机浮点数: 0 <= n < 1.0

print(random.random())


0.6293773053237454

In [4]:
# random.uniform(a, b),
# 用于生成一个指定范围内的随机浮点数,两个参数其中一个是上限,一个是下限。
# 如果a < b,则生成的随机数n: a <= n <= b。如果 a > b, 则 b <= n <= a。

print(random.uniform(1,100))
print(random.uniform(50,10))


34.2581965175054
11.869058993400074

In [5]:
# random.shuffle(x[, random]),
# 用于将一个列表中的元素打乱
a = [12, 23, 1, 5, 87]
random.shuffle(a)
print(a)


[5, 87, 12, 1, 23]

In [6]:
# random.sample(sequence, k),
# 从指定序列中随机获取指定长度的片断。sample函数不会修改原有序列。

print(random.sample(range(10),5))
print(random.sample(range(10),7))


[8, 1, 4, 0, 9]
[4, 9, 1, 0, 2, 7, 6]

思考

  1. 一个猜数程序

In [2]:
# 猜数,人猜
# 简单版本

import random

a = random.randint(1,1000)

print('Now you can guess...')

guess_mark = True

while guess_mark:
    user_number =int(input('please input number:'))
    if user_number > a:
        print('too big')
    if user_number < a:
        print('too small')
    if user_number == a:
        print('bingo!')
        guess_mark = False


Now you can guess...
please input number:565
too small
please input number:760
too small
please input number:900
too big
please input number:850
too big
please input number:800
too big
please input number:777
too big
please input number:766
too big
please input number:765
too big
please input number:762
too big
please input number:761
bingo!

In [ ]:
# 猜数,人猜
# 记录猜数的过程

import random

# 记录人猜了多少数字
user_number_list = []

# 记录人猜了几次
user_guess_count = 0

a = random.randint(1,100)

print('Now you can guess...')
guess_mark = True

# 主循环
while guess_mark:
    user_number =int(input('please input number:'))
    
    user_number_list.append(user_number)
    user_guess_count += 1
    
    if user_number > a:
        print('too big')
    if user_number < a:
        print('too small')
    if user_number == a:
        print('bingo!')
        print('your guess number list:', user_number_list)
        print('you try times:', user_guess_count)
        guess_mark = False

In [ ]:
# 猜数,人猜
# 增加判断次数,如果猜了大于4次显示不同提示语

import random

# 记录人猜了多少数字
user_number_list = []

# 记录人猜了几次
user_guess_count = 0

a = random.randint(1,100)

print('Now you can guess...')

guess_mark = True

# 主循环
while guess_mark:
    
    if 0 <= user_guess_count <= 4:
        user_number =int(input('please input number:'))
    if 4 < user_guess_count <= 100:
        user_number =int(input('try harder, please input number:'))
    
    user_number_list.append(user_number)
    user_guess_count += 1
    
    if user_number > a:
        print('too big')
    if user_number < a:
        print('too small')
    if user_number == a:
        print('bingo!')
        print('your guess number list:', user_number_list)
        print('you try times:', user_guess_count)
        guess_mark = False
  1. 更加复杂的生成随机内容。

可以参考我们开发的python 函数包中的 random 部分,https://fishbase.readthedocs.io/en/latest/fish_random.html

fish_random.gen_random_address(zone) 通过省份行政区划代码,返回该省份的随机地址

fish_random.get_random_areanote(zone) 省份行政区划代码,返回下辖的随机地区名称

fish_random.gen_random_bank_card([…]) 通过指定的银行名称,随机生成该银行的卡号

fish_random.gen_random_company_name() 随机生成一个公司名称

fish_random.gen_random_float(minimum, maximum) 指定一个浮点数范围,随机生成并返回区间内的一个浮点数,区间为闭区间 受限于 random.random 精度限制,支持最大 15 位精度

fish_random.gen_random_id_card([zone, …]) 根据指定的省份编号、性别或年龄,随机生成一个身份证号

fish_random.gen_random_mobile() 随机生成一个手机号

fish_random.gen_random_name([family_name, …]) 指定姓氏、性别、长度,返回随机人名,也可不指定生成随机人名

fish_random.gen_random_str(min_length, …) 指定一个前后缀、字符串长度以及字符串包含字符类型,返回随机生成带有前后缀及指定长度的字符串


In [10]:
from fishbase.fish_random import *

# 这些银行卡卡号只是符合规范,可以通过最基本的银行卡号规范检查,但是实际上是不存在的

# 随机生成一张银行卡卡号
print(gen_random_bank_card())

# 随机生成一张中国银行的借记卡卡号
print(gen_random_bank_card('中国银行', 'CC'))

# 随机生成一张中国银行的贷记卡卡号
print(gen_random_bank_card('中国银行', 'DC'))


4367456382851478
6227586313118152
6216673914496348917

In [16]:
from fishbase.fish_random import *

# 生成假的身份证号码,符合标准身份证的分段设置和校验位

# 指定身份证的地域
print(gen_random_id_card('310000'))

# 增加指定年龄
print(gen_random_id_card('310000', age=70))

# 增加年龄和性别
print(gen_random_id_card('310000', age=30, gender='00'))

# 生成一组
print(gen_random_id_card(age=30, gender='01', result_type='LIST'))


['310104197810177752']
['310119197001192703']
['310104199011217980']
['53092419900907401X', '532424199005059597', '530927199012121779', '530324199004146034', '532101199001157199', '533500199006285057', '533222199007069497', '530827199001145171', '532124199004143539', '530921199001069532', '530702199008158036', '532425199002159118', '532325199008035233', '533422199006189391', '532724199008132776', '530121199012223810', '532326199003308390', '532628199011097238', '533525199006195892', '532524199004067179']

In [ ]: